package com.itany.corejava.code14_lambda;

import com.itany.corejava.code13_jdbc.User;

import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author Miss Chen
 * @version 1.0
 * @date 2024年08月09日11:07
 */
public class Test06_方法引用 {
    public static void main(String[] args) {
        // 匿名内部类->Lambda表达式->方法引用
        // 1.将Lambda表达式替换为方法引用
        // 2.确保[实例方法]的参数、返回值和Lambda表达式一致

        // Consumer<String> c=new Consumer<String>() {
        //     @Override
        //     public void accept(String s) {
        //         System.out.println(s);
        //     }
        // };
        // c.accept("哈哈哈");

        // Consumer<String> c=s-> System.out.println(s);
        // 对象名::实例方法名

        Consumer<String> c2=System.out::println;
        c2.accept("嘻嘻");

        User user=new User();
        Consumer<String> c3=new Consumer<String>() {
            @Override
            public void accept(String s) {
                user.setUsername(s);
            }
        };
        c3.accept("admin");
        System.out.println(user);

        // Consumer<String> c4=s-> user.setUsername(s);

        Consumer<String> c5=user::setUsername;
        c5.accept("huahua");
        System.out.println(user);


        Supplier<String> s=new Supplier<String>() {
            @Override
            public String get() {
                return user.getUsername();
            }
        };

        System.out.println(s.get());

        Supplier<String> s2=user::getUsername;
        System.out.println(s2.get());


        Supplier<String> s3=new Supplier<String>() {
            @Override
            public String get() {
                return User.sayHello();
            }
        };
        System.out.println(s3.get());

        // 类::静态方法名
        Supplier<String> s4=User::sayHello;
        System.out.println(s4.get());

        Predicate<String> pp=new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.equals("aa");
            }
        };
        System.out.println(pp.test("abc"));
        Predicate<String> pp2="aa"::equals;
        System.out.println(pp2.test("aa"));

        System.out.println("============");
        // JDK8中提供BiPredicate类,BiPredicate<T, U>, boolean test(T t, U u)
        // 此时两个泛型分别对应方法的调用者与方法的参数
        // 第一个泛型是调用者方法的调用者类型
        // 第二个泛型是方法参数的类型
        // 此时在定义时，无法确定具体的调用者是谁
        // 但是我是能够知道一定是字符串类型
        // 此时可以使用类::示例方法名的方式进行定义
        BiPredicate<String,String> bp=new BiPredicate<String, String>() {
            @Override
            public boolean test(String s, String s2) {
                return s.equals(s2);
            }
        };
        // System.out.println(bp.test("aaa","aaa"));;

        BiPredicate<String,String> bp2=String::equals;
        System.out.println(bp2.test("abc","hello"));;


    }

}
